'''
Created on 07.08.2011

@author: osman
'''

import unittest
from opf.container import session, Container, ANY

I = 'I'; love = 'love'; Python = 'Python'
know = 'know'; has = 'has'; cat = 'cat'
Vlad = 'Vlad'; Alex = 'Alex'; use = 'use'

class ContainerTestCase(unittest.TestCase):
    def _prepare(self):
        self.c = Container()
        with session(self.c):
            (self.c <<
                (1, I, love, Python) <<
                (1, Vlad, love, Python) <<
                (Alex, know, 1) <<
                (I, know, Alex) <<
                (Alex, has, cat) <<
                (cat, know, Python))
    def test_erase(self):
        self._prepare()
        self.c.erase()
        self.assertEqual(self.c.len(), 0, "container is not empty after erase")
    def test_len(self):
        self._prepare()
        self.assertEqual(self.c.len(), 6, "Container.len() returns wrong value")
    def test_in(self):
        self._prepare()
        msg = "'__contains__' method error"
        self.assertTrue(know in self.c, msg)
        self.assertFalse(use in self.c, msg)
        self.assertTrue((I, know) in self.c, msg)
        self.assertTrue((Alex, has, cat) in self.c, msg)
        self.assertTrue((ANY, love, Python) in self.c, msg)
    def test_count(self):
        self._prepare()
        msg = "'count' method error"
        self.assertEqual(self.c.count((Alex, has, cat)), 1, msg)
        self.assertEqual(self.c.count((ANY, love, Python)), 2, msg)
        self.assertEqual(self.c.count((ANY, ANY, love, Python)), 2, msg)
        self.assertEqual(self.c.count((2, ANY, love, Python)), 0, msg)
    def test_getitem(self):
        self._prepare()
        msg = "'__getitem__' method error"
        s = set(self.c[ANY, ANY, love, Python])
        self.assertIn((1, I, love, Python), s, msg)
        self.assertIn((1, Vlad, love, Python), s, msg)
        s = set(self.c[ANY, love, Python])
        self.assertIn((1, I, love, Python), s, msg)
        self.assertIn((1, Vlad, love, Python), s, msg)
        s = set(self.c[know])
        self.assertIn((0, Alex, know, 1), s, msg)
        self.assertIn((0, I, know, Alex), s, msg)
        self.assertIn((0, cat, know, Python), s, msg)
    def test_delitem(self):
        self._prepare()
        msg = "'__delitem__' method error"
        del self.c[ANY, ANY, love, Python]
        self.assertEqual(self.c.len(), 4, msg)
        del self.c[Alex, has]
        self.assertEqual(self.c.len(), 3, msg)
    def test_iter(self):
        self._prepare()
        msg = "'__iter__' method error"
        s = set(self.c)
        self.assertIn((1, I, love, Python), s, msg)
        self.assertIn((1, Vlad, love, Python), s, msg)
        self.assertIn((0, Alex, know, 1), s, msg)
        self.assertIn((0, I, know, Alex), s, msg)
        self.assertIn((0, Alex, has, cat), s, msg)
        self.assertIn((0, cat, know, Python), s, msg)
